再利用される Cell に UIControl があるときはちゃんと Action, Target を削除しよう

UICollectionViewCell のように再利用されるものに、ボタンのような UIControl を配置して addAction / addTarget している際は、前のを削除しよう
最近だと addActionUIAction を追加することが多いだろうが、その場合は以下のような extension を用意しておくと削除が楽。

こういうったものを prepareForReuse で呼び出しておく。

extension UIControl {
  public func removeAllActions() {
    enumerateEventHandlers { action, _, event, _ in
      if let action = action {
        removeAction(action, for: event)
      }
    }
  }
}

具体的にどんなことに困ったか

Bunpo でクイズの画面を UICollectionViewCell で作っているが、選択肢のボタンに対して「タップした際に正解・不正解に応じた見た目に変化する」Action を追加していた。
これが再利用されたときに、前の Action が残っていて、正解なのに一瞬だけ不正解の表示がちらっと見えていた。

iOS Development UIKit